//******************************************************************
//******************************************************************
//**********          ANts Peer To Peer Sources        *************
//
// ANts P2P realizes a third generation P2P net. It protects your
// privacy while you are connected and makes you not trackable, hiding
// your identity (ip) and crypting everything you are sending/receiving
// from others.

// Copyright (C) 2004  Roberto Rossi

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

package ants.p2p.messages;

import ants.p2p.Message;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.*;
import javax.crypto.spec.DHPublicKeySpec;
import javax.crypto.interfaces.*;

public class SecurityResponseMessage extends Message {
	/**
	 * Determines if a de-serialized file is compatible with this class.
	 *
	 * Maintainers must change this value if and only if the new version
	 * of this class is not compatible with old versions. See Sun docs
	 * for <a href=http://java.sun.com/products/jdk/1.1/docs/guide
	 * /serialization/spec/version.doc.html> details. </a>
	 *
	 * Not necessary to include in first version of the class, but
	 * included here as a reminder of its importance.
	 */
	private static final long serialVersionUID = 5679898870113020529L;
	private String peerPubKeyY;
	private Message requestMessage;
	private String g;
	private String p;

	public SecurityResponseMessage(Message m, PublicKey peerPubKey,
			Message requestMessage) throws NoSuchAlgorithmException,
			InvalidKeySpecException {
		super(m);
		this.peerPubKeyY = ((DHPublicKey) peerPubKey).getY().toString();
		DHPublicKeySpec peerPubKeySpec = (DHPublicKeySpec) KeyFactory
				.getInstance("DH")
				.getKeySpec(peerPubKey, DHPublicKeySpec.class);
		this.g = peerPubKeySpec.getG().toString();
		this.p = peerPubKeySpec.getP().toString();
		this.requestMessage = requestMessage;
	}

	public SecurityResponseMessage(PublicKey peerPubKey, Message requestMessage)
			throws NoSuchAlgorithmException, InvalidKeySpecException {
		super();
		this.peerPubKeyY = ((DHPublicKey) peerPubKey).getY().toString();
		DHPublicKeySpec peerPubKeySpec = (DHPublicKeySpec) KeyFactory
				.getInstance("DH")
				.getKeySpec(peerPubKey, DHPublicKeySpec.class);
		this.g = peerPubKeySpec.getG().toString();
		this.p = peerPubKeySpec.getP().toString();
		this.requestMessage = requestMessage;
	}

	public Message getRequestMessage() {
		return this.requestMessage;
	}

	private BigInteger getG() {
		return new BigInteger(this.g);
	}

	private BigInteger getP() {
		return new BigInteger(this.p);
	}

	public PublicKey getPeerPubkey() throws Exception {
		DHPublicKeySpec peerPubKeySpec = new DHPublicKeySpec(new BigInteger(
				peerPubKeyY), this.getP(), this.getG());
		return KeyFactory.getInstance("DH").generatePublic(peerPubKeySpec);
	}
}
